#ifndef _GRAFO_DIN
#define _GRAFO_DIN


typedef struct graph *Graph;

typedef struct node *Node;

/**
 * @fn createGraph
 * @brief Cria um grafo. Devolve a referencia do grafo ou NULL se não há memória(NO_MEM)
 */
Graph createGraph();


/**
 * @fn destroyGraph
 * @brief Destroi o grafo apontador por ptr e coloca a referencia a NULL. Retorna OK ou NO_GRAPH
 * @param ptr Apotandor para o grafo que se pretende apagar
 */
int destroyGraph(Graph *ptr);


/**
 * @fn copyGraph
 * @brief Copia o grafo apontado por ptr. Devolve o apontador para a cabeça do grafo cópia ou NULL, caso não consiga copiar. Retorna OK, NO_GRAPH ou NO_MEM
 * @param ptr Apontador para o grafo que se pretende copiar
 */
Graph copyGraph(Graph ptr);


/**
 * @fn insertVert
 * @brief Insere o vertice vert no grafo apontado por ptr. Retorna OK, NO_GRAPH ou REP_VERT
 * @param vert Vertice a inserir. Unisigned int porque nunca teremos nodos "negativos", e assim poderemos ter valores positivos maiores
 * @param ptr Apontador para o grafo onde se pretende inserir o vertice
 */
int insertVert(Graph ptr, unsigned int vert);


/**
 * @fn removeVert
 * @brief Remove o vertice vert no grafo apontado por ptr. Remove também todas as arestas associadas a vert. Retorna OK, NO_GRAPH, GRAPH_EMPTY ou NO_VERT
 * @param vert Vertice a remover
 * @param ptr Apontador para o grafo onde se pretende remover o vertice
 */
int removeVert(Graph ptr, unsigned int vert);


/**
 * @fn insertEdge
 * @brief Insere a aresta com peso cost entre os vertice vert1 e vert2, no grafo apontado por ptr. Retorna OK, NO_GRAPH, NO_VERT ou EDGE_REP
 * @param vert1 Primeiro vertice da aresta
 * @param vert2 Segundo vertice da aresta
 * @param ptr Apontador para o grafo onde se quer inserir a aresta entre dois vértices desse grafo
 * @param cost Custo associado à aresta
 */
int insertEdge(Graph ptr, unsigned int vert1, unsigned int vert2, int cost);


/**
 * @fn insertReverseEdge
 * @brief No caso do grafo se tratar de não-orientado, a função irá criar a aresta no sentido inverso à criada pela função insertEdge
 * @param vert1 Primeiro vertice da aresta
 * @param vert2 Segundo vertice da aresta
 * @param ptr Apontador para o grafo onde se quer inserir a aresta entre dois vértices desse grafo
 * @param cost Custo associado à aresta
 */
int insertReverseEdge(Graph ptr, unsigned int vert2, unsigned int vert1, int cost);


/**
 * @fn removeEdge
 * @brief Remove a aresta entre vert1 e vert2 no grafo apontado por ptr. Retorna OK, NO_GRAPH, NO_VERT ou NO_EDGE
 * @param ptr Apontador para o grafo onde se quer remover a aresta entre dois vertices
 * @param vert1 Primeiro vertice da aresta
 * @param vert2 Segundo vertice da aresta
 */
int removeEdge(Graph ptr, unsigned int vert1, unsigned int vert2);


/**
 * @fn removeReverseEdge
 * @brief No caso de o grafo ser não-orientado, a função irá remover a aresta no sentido invers à removida pela funçao removeEdge
 * @param ptr Apontador para o grafo onde se quer remover a aresta entre dois vertices
 * @param vert1 Primeiro vertice da aresta
 * @param vert2 Segundo vertice da aresta
 */
int removeReverseEdge(Graph ptr, unsigned int vert2, unsigned int vert1);


/**
 * @fn numberVert
 * @brief Determina o numero de vertices existentes no grafo apontado por ptr. Retorna OK, NO_GRAPH ou NULL_PTR
 * @param ptr Apontador para o grafo a considerar
 * @param nvert Número de vertices
 */
int numberVert(Graph ptr, unsigned int *nvert);


/**
 * @fn numberEdge
 * @brief Determina o numero de arestas existentes no grafo apontado por ptr. Retorna OK, NO_GRAPH ou NULL_PTR
 * @param ptr Apontador para o grafo a considerar
 * @param nedge Número de arestas
 */
int numberEdge(Graph ptr, unsigned int *nedge);


/**
 * @fn getVertList
 * @brief Cria uma sequencia de caracteres do vertice vert, incluindo a sua lista de adjacencias, do grafo apontado por ptr.
 *		  Funçao necessaria para a escrita do grafo no montiro seja controlada. Retorna OK, NO_GRAPH ou NULL_PTR
 * @param ptr Apontador para o grafo considerado
 * @param vert Vertice pretendido
 * @param vertlist String de caracteres com a informaçao do vertice vert
 */
int getVertList(Graph ptr, unsigned int vert, char *vertlist);




#endif

#ifndef _GRAFO_DIN
#define _GRAFO_DIN


typedef struct graph *Graph;

typedef struct node *Node;

/**
 * @fn createGraph
 * @brief Cria um grafo. Devolve a referencia do grafo ou NULL se não há memória(NO_MEM)
 */
Graph createGraph();


/**
 * @fn destroyGraph
 * @brief Destroi o grafo apontador por ptr e coloca a referencia a NULL. Retorna OK ou NO_GRAPH
 * @param ptr Apotandor para o grafo que se pretende apagar
 */
int destroyGraph(Graph *ptr);


/**
 * @fn copyGraph
 * @brief Copia o grafo apontado por ptr. Devolve o apontador para a cabeça do grafo cópia ou NULL, caso não consiga copiar. Retorna OK, NO_GRAPH ou NO_MEM
 * @param ptr Apontador para o grafo que se pretende copiar
 */
Graph copyGraph(Graph ptr);


/**
 * @fn insertVert
 * @brief Insere o vertice vert no grafo apontado por ptr. Retorna OK, NO_GRAPH ou REP_VERT
 * @param vert Vertice a inserir. Unisigned int porque nunca teremos nodos "negativos", e assim poderemos ter valores positivos maiores
 * @param ptr Apontador para o grafo onde se pretende inserir o vertice
 */
int insertVert(Graph ptr, unsigned int vert);


/**
 * @fn removeVert
 * @brief Remove o vertice vert no grafo apontado por ptr. Remove também todas as arestas associadas a vert. Retorna OK, NO_GRAPH, GRAPH_EMPTY ou NO_VERT
 * @param vert Vertice a remover
 * @param ptr Apontador para o grafo onde se pretende remover o vertice
 */
int removeVert(Graph ptr, unsigned int vert);


/**
 * @fn insertEdge
 * @brief Insere a aresta com peso cost entre os vertice vert1 e vert2, no grafo apontado por ptr. Retorna OK, NO_GRAPH, NO_VERT ou EDGE_REP
 * @param vert1 Primeiro vertice da aresta
 * @param vert2 Segundo vertice da aresta
 * @param ptr Apontador para o grafo onde se quer inserir a aresta entre dois vértices desse grafo
 * @param cost Custo associado à aresta
 */
int insertEdge(Graph ptr, unsigned int vert1, unsigned int vert2, int cost);


/**
 * @fn insertReverseEdge
 * @brief No caso do grafo se tratar de não-orientado, a função irá criar a aresta no sentido inverso à criada pela função insertEdge
 * @param vert1 Primeiro vertice da aresta
 * @param vert2 Segundo vertice da aresta
 * @param ptr Apontador para o grafo onde se quer inserir a aresta entre dois vértices desse grafo
 * @param cost Custo associado à aresta
 */
int insertReverseEdge(Graph ptr, unsigned int vert2, unsigned int vert1, int cost);


/**
 * @fn removeEdge
 * @brief Remove a aresta entre vert1 e vert2 no grafo apontado por ptr. Retorna OK, NO_GRAPH, NO_VERT ou NO_EDGE
 * @param ptr Apontador para o grafo onde se quer remover a aresta entre dois vertices
 * @param vert1 Primeiro vertice da aresta
 * @param vert2 Segundo vertice da aresta
 */
int removeEdge(Graph ptr, unsigned int vert1, unsigned int vert2);


/**
 * @fn removeReverseEdge
 * @brief No caso de o grafo ser não-orientado, a função irá remover a aresta no sentido invers à removida pela funçao removeEdge
 * @param ptr Apontador para o grafo onde se quer remover a aresta entre dois vertices
 * @param vert1 Primeiro vertice da aresta
 * @param vert2 Segundo vertice da aresta
 */
int removeReverseEdge(Graph ptr, unsigned int vert2, unsigned int vert1);


/**
 * @fn numberVert
 * @brief Determina o numero de vertices existentes no grafo apontado por ptr. Retorna OK, NO_GRAPH ou NULL_PTR
 * @param ptr Apontador para o grafo a considerar
 * @param nvert Número de vertices
 */
int numberVert(Graph ptr, unsigned int *nvert);


/**
 * @fn numberEdge
 * @brief Determina o numero de arestas existentes no grafo apontado por ptr. Retorna OK, NO_GRAPH ou NULL_PTR
 * @param ptr Apontador para o grafo a considerar
 * @param nedge Número de arestas
 */
int numberEdge(Graph ptr, unsigned int *nedge);


/**
 * @fn getVertList
 * @brief Cria uma sequencia de caracteres do vertice vert, incluindo a sua lista de adjacencias, do grafo apontado por ptr.
 *		  Funçao necessaria para a escrita do grafo no montiro seja controlada. Retorna OK, NO_GRAPH ou NULL_PTR
 * @param ptr Apontador para o grafo considerado
 * @param vert Vertice pretendido
 * @param vertlist String de caracteres com a informaçao do vertice vert
 */
int getVertList(Graph ptr, unsigned int vert, char *vertlist);




#endif
